home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 December / PCWorld_2007-12_cd.bin / v cisle / aircrack / aircrack-ng-0.9.1-win.exe / aircrack-ng-win-0.9.1 / test / makeivs.c next >
C/C++ Source or Header  |  2007-02-12  |  2KB  |  94 lines

  1. #include <stdio.h>
  2.  
  3. #define SWAP(x,y) { unsigned char tmp = x; x = y; y = tmp; }
  4.  
  5. int main( int argc, char *argv[] )
  6. {
  7.     int i, j, n;
  8.     FILE *f_ivs_out;
  9.     unsigned char K[16];
  10.     unsigned char S[256];
  11.     unsigned char buffer[64], *s;
  12.  
  13.     if( argc != 3 )
  14.     {
  15.         printf( "usage: makeivs <ivs file> <104-bit key>\n" );
  16.         return( 1 );
  17.     }
  18.  
  19.     i = 0;
  20.     s = (unsigned char *) argv[2];
  21.  
  22.     buffer[0] = s[0];
  23.     buffer[1] = s[1];
  24.     buffer[2] = '\0';
  25.  
  26.     while( sscanf( (char*) buffer, "%x", &n ) == 1 )
  27.     {
  28.         if( n < 0 || n > 255 )
  29.         {
  30.             fprintf( stderr, "Invalid wep key.\n" );
  31.             return( 1 );
  32.         }
  33.  
  34.         K[3 + i++] = n;
  35.  
  36.         if( i >= 16 ) break;
  37.  
  38.         s += 2;
  39.  
  40.         if( s[0] == ':' || s[0] == '-' )
  41.             s++;
  42.  
  43.         if( s[0] == '\0' || s[1] == '\0' )
  44.             break;
  45.  
  46.         buffer[0] = s[0];
  47.         buffer[1] = s[1];
  48.     }
  49.  
  50.     if( i != 13 )
  51.     {
  52.         fprintf( stderr, "Invalid wep key.\n" );
  53.         return( 1 );
  54.     }
  55.  
  56.  
  57.     if( ( f_ivs_out = fopen( argv[1], "wb+" ) ) == NULL )
  58.     {
  59.         perror( "fopen" );
  60.         return( 1 );
  61.     }
  62.  
  63.     fprintf( f_ivs_out, "\xBF\xCA\x84\xD4\x01\x01\x01\x01\x01\x01" );
  64.  
  65.     for( n = 0x000000; n <= 0x0FFFFF; n++ )
  66.     {
  67.         K[2] = ( n >> 16 ) & 0xFF;
  68.         K[1] = ( n >>  8 ) & 0xFF;
  69.         K[0] = ( n       ) & 0xFF;
  70.  
  71.         fprintf( f_ivs_out, "%c%c%c", K[0], K[1], K[2] );
  72.  
  73.         for( i = 0; i < 256; i++ )
  74.             S[i] = i;
  75.  
  76.         for( i = j = 0; i < 256; i++ )
  77.         {
  78.             j = ( j + S[i] + K[i & 15] ) & 0xFF;
  79.             SWAP( S[i], S[j] );
  80.         }
  81.  
  82.         i = 1; j = ( 0 + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  83.         fprintf( f_ivs_out, "%c", 0xAA ^ S[(S[i] + S[j]) & 0xFF] );
  84.  
  85.         i = 2; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  86.         fprintf( f_ivs_out, "%c\xFF", 0xAA ^ S[(S[i] + S[j]) & 0xFF] );
  87.     }
  88.  
  89.     fclose( f_ivs_out );
  90.     printf( "Done.\n" );
  91.     return( 0 );
  92. }
  93.  
  94.